﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Siser.Web.Models;
using Siser.Web.Authorization;
using Siser.Web.Security;
using System.IO;
using System.Configuration;
using Siser.Web.Shared;
using System.Data.Entity.Validation;
using System.Diagnostics;

namespace Siser.Web.Controllers
{ 
    public class UsuarioController : Controller
    {
        private SiserEntities db = new SiserEntities();

        public ViewResult Index()
        {
            var usuarios = db.Usuarios.Include(u => u.Empleado).Include(u => u.Rol);
            return View(usuarios.ToList());
        }

        protected override void Dispose(bool disposing)
        {
            db.Dispose();
            base.Dispose(disposing);
        }

        #region "   CRUD"

        public ActionResult Create()
        {
            ViewBag.EmpleadoId = new SelectList(db.Empleados, "Id", "Nombre");
            ViewBag.RolId = new SelectList(db.Roles, "Id", "Nombre");
            return View();
        } 


        [HttpPost]
        public ActionResult Create(TarjetaIdentificacion tarjetaIdentificacion)
        {
            if (ModelState.IsValid)
            {
                tarjetaIdentificacion.FechaRegistro = DateTime.Now;
                tarjetaIdentificacion.Vigencia = true;

                tarjetaIdentificacion.Usuario.Contrasena = Encryption.encryptSha1(tarjetaIdentificacion.Usuario.Contrasena);

                Random random = new Random();
                for (int i = 1; i <= 5; i++)
                {
                    for (int j = 1; j <= 5; j++)
                    {
                        db.Coordenadas.Add(new Coordenada()
                        {
                            I = i.ToString(),
                            J = Authorization.Membership.ConvertNumberToLetter(j),
                            Valor = random.Next(1, 99).ToString().PadLeft(2, '0')
                        });
                    }
                }

                db.TarjetasIdentificaciones.Add(tarjetaIdentificacion);
                db.Usuarios.Add(tarjetaIdentificacion.Usuario);                
                db.SaveChanges();
                return RedirectToAction("Index");  
            }

            ViewBag.EmpleadoId = new SelectList(db.Empleados, "Id", "Nombre", tarjetaIdentificacion.Usuario.EmpleadoId);
            ViewBag.RolId = new SelectList(db.Roles, "Id", "Nombre", tarjetaIdentificacion.Usuario.RolId);
            return View(tarjetaIdentificacion);
        }

        public ActionResult Edit(int id)
        {
            Usuario usuario = db.Usuarios.Find(id);
            ViewBag.EmpleadoId = new SelectList(db.Empleados, "Id", "Nombre", usuario.EmpleadoId);
            ViewBag.RolId = new SelectList(db.Roles, "Id", "Nombre", usuario.RolId);
            return View(usuario);
        }


        private TarjetaIdentificacion getTarjetaIdentificacion()
        {
            Random random = new Random();
            TarjetaIdentificacion tarjetaIdentificacion = new TarjetaIdentificacion()
            {
                FechaRegistro = DateTime.Now,
                Vigencia = true
            };

            for (int i = 1; i <= 5; i++)
            {
                for (int j = 1; j <= 5; j++)
                {
                    tarjetaIdentificacion.Coordenadas.Add(new Coordenada()
                    {
                        I = i.ToString(),
                        J = Authorization.Membership.ConvertNumberToLetter(j),
                        Valor = random.Next(1, 99).ToString().PadLeft(2, '0')
                    });
                }
            }
            return tarjetaIdentificacion;
        }


        [HttpPost]
        public ActionResult Edit(Usuario usuario)
        {
            bool flag = true;
            Usuario user = db.Usuarios.Find(usuario.Id);
            user.Nombre = usuario.Nombre;
            user.RolId = user.RolId;
            user.ContrasenaComparada = user.Contrasena;

            if (user.Vigencia == false)
            {
                flag = false;
                user.Vigencia = true;
                user.TarjetasIdentificacion.Add(getTarjetaIdentificacion());
            }

            try
            {
                db.Entry(user).State = EntityState.Modified;
                db.SaveChanges();

                if (!flag)
                {
                    Mail.Send("siser.noreply@cchen.cl", user.Empleado.CorreoElectronico,
                         "Tarjeta Identificación. CORREO SISER - NO RESPONDA", "Estimado " + user.Empleado.Nombre +
                         " se adjunta su tarjeta de identificación", true, CredencialIngresoPDF.GetPDFStream(usuarioID: user.Id));

                }
            }
            catch (DbEntityValidationException dbEx)
            {
                foreach (var validationErrors in dbEx.EntityValidationErrors)
                {
                    foreach (var validationError in validationErrors.ValidationErrors)
                    {
                        Trace.TraceInformation("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage);
                    }
                }
            }
            
            return RedirectToAction("Index");
        }

        public ViewResult Details(int id)
        {
            Usuario usuario = db.Usuarios.Find(id);
            return View(usuario);
        }

        #endregion

        public ActionResult Registro()
        {
            ViewBag.EmpresaId = new SelectList(db.Empresas, "Id", "Nombre");
            List<Planta> lPlantas = new List<Planta>();
            ViewBag.PlantaId = new SelectList(lPlantas, "Id", "Nombre");
            ViewBag.CargoId = new SelectList(db.Cargos, "Id", "Nombre");
            ViewBag.DepartamentoId = new SelectList(db.Departamentos, "Id", "Nombre");
            return View();
        }


        [HttpPost]
        public ActionResult Registro(UsuarioPendiente usuarioPendiente)
        {
            if (ModelState.IsValid)
            {
                string nombreImagen = null;
                string path = "~/Content/images/";
                Random random = new Random();

                HttpPostedFileBase imagen = Request.Files["Imagen"];
                if (imagen != null && imagen.ContentLength > 0)
                {
                    nombreImagen = Path.GetFileName(imagen.FileName);
                    nombreImagen = Path.GetFileNameWithoutExtension(nombreImagen) + "_" + random.Next(999).ToString().PadLeft(3, '0') + Path.GetExtension(nombreImagen);
                    path = Path.Combine(Server.MapPath(ConfigurationManager.AppSettings["PathImagenUsuario"]), nombreImagen);
                    imagen.SaveAs(path);
                }
                // válidar digito verificador
                usuarioPendiente.Usuario.Empleado.EmpresaId = usuarioPendiente.EmpresaId;
                usuarioPendiente.Usuario.Empleado.Rut = usuarioPendiente.Usuario.Empleado.Rut.Replace(".", "").Remove(usuarioPendiente.Usuario.Empleado.Rut.Replace(".", "").IndexOf('-'), 2);


                var Usuario = usuarioPendiente.Usuario.Nombre;
                var ComparaUsuario = (from u in db.Usuarios
                                      where u.Nombre == Usuario
                                      select u.Id).ToList();
                if (ComparaUsuario.Count != 0)
                {
                    ViewBag.EmpresaId = new SelectList(db.Empresas, "Id", "Nombre", usuarioPendiente.EmpresaId);
                    ViewBag.PlantaId = new SelectList(db.Plantas, "Id", "Nombre", usuarioPendiente.PlantaId);
                    ViewBag.CargoId = new SelectList(db.Cargos, "Id", "Nombre");
                    ViewBag.DepartamentoId = new SelectList(db.Departamentos, "Id", "Nombre");
                    TempData["alerta1"] = "* Nombre de Usuario ya existe...";
                    return View(usuarioPendiente);
                }
                else
                {
                    TempData["alerta1"] = "";
                    var Rut = usuarioPendiente.Usuario.Empleado.Rut;
                    var Correo = usuarioPendiente.Usuario.Empleado.CorreoElectronico;
                    var ComparaRut = (from e in db.Empleados
                                      where e.Rut == Rut || e.CorreoElectronico == Correo
                                      select e.Id).ToList();
                    if (ComparaRut.Count == 0)
                    {
                        usuarioPendiente.Usuario.TarjetasIdentificacion.Add(getTarjetaIdentificacion());
                        usuarioPendiente.Usuario.Vigencia = false;
                        usuarioPendiente.Usuario.Contrasena = Encryption.encryptSha1(usuarioPendiente.Usuario.Contrasena);
                        usuarioPendiente.Usuario.ContrasenaComparada = usuarioPendiente.Usuario.Contrasena;
                        usuarioPendiente.Usuario.RolId = 15;
                        usuarioPendiente.AreaTrabajo = usuarioPendiente.Usuario.Empleado.DepartamentoId.ToString();
                        usuarioPendiente.Cargo = usuarioPendiente.Usuario.Empleado.CargoId.ToString();
                        usuarioPendiente.CodigoTarjetaCCHEN = "Vacio";
                        usuarioPendiente.FechaRegistro = DateTime.Now;
                        usuarioPendiente.Activo = false;
                        db.UsuariosPendientes.Add(usuarioPendiente);
                        db.SaveChanges();

                        Mail.Send("siser.noreply@cchen.cl",
                                usuarioPendiente.Usuario.Empleado.CorreoElectronico,
                                  "Registro SISER",
                                  "Hemos recibido su solicitud de registro y será procesada dentro de las próximas 48 hrs.",false);

                        return RedirectToAction("InicioSesion", "Cuenta");
                    }
                    else
                    {
                        ViewBag.EmpresaId = new SelectList(db.Empresas, "Id", "Nombre", usuarioPendiente.EmpresaId);
                        ViewBag.PlantaId = new SelectList(db.Plantas, "Id", "Nombre", usuarioPendiente.PlantaId);
                        ViewBag.CargoId = new SelectList(db.Cargos, "Id", "Nombre");
                        ViewBag.DepartamentoId = new SelectList(db.Departamentos, "Id", "Nombre");
                        TempData["alerta2"] = "* Rut o Correo ya existen...";
                        return View(usuarioPendiente);
                    }
                }
            }
            ViewBag.EmpresaId = new SelectList(db.Empresas, "Id", "Nombre", usuarioPendiente.EmpresaId);
            ViewBag.PlantaId = new SelectList(db.Plantas, "Id", "Nombre", usuarioPendiente.PlantaId);
            ViewBag.CargoId = new SelectList(db.Cargos, "Id", "Nombre");
            ViewBag.DepartamentoId = new SelectList(db.Departamentos, "Id", "Nombre");
            return View();
        }

        public ActionResult ReenvioCredencial()
        {
            return View();
        }

        [HttpPost, ActionName("ReenvioCredencial")]
        public ActionResult ReenvioCredencial(Usuario user)
        {

            var usuario = (from u in db.Usuarios
                                           where u.Nombre == user.Nombre && u.Vigencia==true
                                            select u).ToList();
            
            if(usuario.Count != 0)
            {
                foreach (var u in usuario)
                {
                Mail.Send("siser.noreply@cchen.cl", u.Empleado.CorreoElectronico,
                        "Tarjeta Identificación. CORREO SISER - NO RESPONDA", "Estimado " + u.Empleado.Nombre +
                                                                                           " se adjunta su tarjeta de identificación", true, CredencialIngresoPDF.GetPDFStream(nombreUsuario: user.Nombre));
                }
                ViewBag.Resultado ="V";
                return View("ReenvioCredencial");
            }
            else
            {
                ViewBag.Mensaje = "Intente nuevamente.";
                return View("ReenvioCredencial");
            }         
        }

        [HttpPost]
        public JsonResult listarPlantasAsociadas(int idEmpresa)
        {
            var plantas = (
                                from p in db.Plantas
                                where p.EmpresaId == idEmpresa
                                select p
                            );
            List<Planta> lPlantas = new List<Planta>();
            foreach (var pl in plantas)
            {
                Planta p = new Planta();
                p.Nombre = pl.Nombre;
                p.Id = pl.Id;
                lPlantas.Add(p);
            }

            Planta p1 = new Planta();
            p1.Id = 0;
            p1.Nombre = "Seleccione";
            lPlantas.Insert(0, p1);
            return Json(new { Result = lPlantas });
        }
    }
}